package br.com.pnfp.web.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.pnfp.web.model.dao.IEntidadeDAO;
import br.com.pnfp.web.model.vo.Doador;
import br.com.pnfp.web.model.vo.Entidade;
import br.com.pnfp.web.model.vo.Usuario;

@Repository
public class EntidadeDAO extends DAO implements IEntidadeDAO {

	@Override
	public List<Entidade> consultar(Entidade vo) {

		String sql = "SELECT entidade.cd_entidade, entidade.dc_razao_social, entidade.cd_sefaz, entidade.dc_cnpj, entidade.dt_cadastro, entidade.cd_usuario_cadastro " +
				"FROM tb_entidade entidade, tb_usuario usuario " +
				"WHERE entidade.cd_usuario_cadastro = usuario.cd_usuario and usuario.cd_empresa = ? and ";
		List<Object> params = new ArrayList<Object>();
		params.add(vo.getUsuarioSistema().getEmpresa().getCodigo());
		
		if(vo.getCodigo() != null) {
			sql += "entidade.cd_entidade = ? and ";
			params.add(vo.getCodigo());
		} else if(vo.getCnpj() != null && !vo.getCnpj().equals("")) {
			sql += "entidade.dc_cnpj = ? and ";
			params.add(vo.getCnpj());
		} else {
			sql += "entidade.dc_razao_social like ? and ";
			String desc = "%";
			if(vo.getRazaoSocial() != null && !vo.getRazaoSocial().equals("")) {
				desc = vo.getRazaoSocial() + "%";
			}
			params.add(desc);
		}
		sql += "entidade.id_ativo = 1 order by entidade.dc_razao_social";

		List<Entidade> result = query(sql, params.toArray(), new RowMapper<Entidade>() {
			@Override
			public Entidade mapRow(ResultSet rs, int arg1) throws SQLException {
				Entidade vo = new Entidade();
				vo.setCodigo(rs.getInt("entidade.cd_entidade"));
				vo.setRazaoSocial(rs.getString("entidade.dc_razao_social"));
				vo.setCnpj(rs.getString("entidade.dc_cnpj"));
				vo.setCodigoSefaz(rs.getInt("entidade.cd_sefaz"));
				vo.setCadastro(rs.getDate("entidade.dt_cadastro"));
				vo.setUsuarioCadastro(new Usuario(rs.getInt("entidade.cd_usuario_cadastro")));
				return vo;
			}
			
		});		
		
		return result;
	}
	
	@Override
	public void incluir(Entidade vo) {
		String sql = "INSERT INTO tb_entidade(dc_razao_social, dc_cnpj, cd_sefaz, cd_usuario_cadastro, dt_cadastro) values(?,?,?,?,?);";
		update(sql, new Object[]{vo.getRazaoSocial(), vo.getCnpj(), vo.getCodigoSefaz(), vo.getUsuarioSistema().getCodigo(), new Date()});
		
	}
	
	@Override
	public void alterar(Entidade vo) {
		String sql = "UPDATE tb_entidade set dc_razao_social = ?, cd_sefaz = ? where cd_entidade = ?";
		update(sql, new Object[] {vo.getRazaoSocial(), vo.getCodigoSefaz(), vo.getCodigo()});
		
	}
	
	@Override
	public void excluir(Integer codigo) {
		String sql = "DELETE FROM tb_entidade_doador where cd_entidade = ? and id_atual = 1";
		update(sql, new Object[] {codigo});
		
		sql = "UPDATE tb_entidade set id_ativo = 0 where cd_entidade = ?";
		update(sql, new Object[] {codigo});
	}
	
	@Override
	public void associarDoador(Entidade vo) {
		String sql = "UPDATE tb_entidade_doador set id_atual = 0 where cd_doador = ? and id_atual = 1";
		update(sql, new Object[]{vo.getDoadores().get(0).getCodigo()});
		
		try {
			sql = "SELECT cd_entidade FROM tb_entidade_doador where cd_doador = ? and cd_entidade = ? and id_atual = 0";
			queryForInt(sql, new Object[] {vo.getDoadores().get(0).getCodigo(), vo.getCodigo()});
			sql = "UPDATE tb_entidade_doador set id_atual = 1 where cd_doador = ? and cd_entidade = ?";
			update(sql, new Object[]{vo.getDoadores().get(0).getCodigo(), vo.getCodigo()});
		} catch(EmptyResultDataAccessException exc) {
			sql = "INSERT INTO tb_entidade_doador(cd_entidade, cd_doador, dt_cadastro) values(?,?,?)";
			update(sql, new Object[]{vo.getCodigo(), vo.getDoadores().get(0).getCodigo(), new Date()});
		}
		
		sql = "UPDATE tb_cupom set cd_entidade = ? where cd_doador = ?";
		update(sql, new Object[]{vo.getCodigo(), vo.getDoadores().get(0).getCodigo()});
		
	}
	
	@Override
	public List<Doador> consultaDoadorAssociado(Entidade vo) {
		String sql = "SELECT cd_doador from tb_entidade_doador WHERE cd_entidade = ?  and id_atual = 1";
		List<Doador> list = query(sql, new Object[] {vo.getCodigo()}, new RowMapper<Doador>() {
			@Override
			public Doador mapRow(ResultSet rs, int arg1) throws SQLException {
				return new Doador(rs.getInt("cd_doador"));
			}
		});
		return list;
	}	
}
